// @/composables/useInitApp.js
import { ElMessage } from 'element-plus';
import { useSystemStore } from '@/stores';
import { useAlarmCenterStore } from '@/stores/alarmCenter';
import useStompJsStore from '@/stores/webSocket';
import { clearToken, getToken } from '@/utils/auth';

export function useInitApp() {
  const systemStore = useSystemStore();
  const stompJsStore = useStompJsStore();
  const alarmStore = useAlarmCenterStore();

  // 🔁 标记是否已注册过音频解锁事件
  let hasRegisteredInteraction = false;

  // 🔊 音频上下文解锁函数
  function unlockAudio() {
    console.info('🔓 用户已交互，尝试激活音频上下文...');
    hasRegisteredInteraction = true; // 可省略，因为 { once: true }

    // 可选：播放一个极低音量的音频来“激活”上下文
    const audioModules = import.meta.glob('../assets/voice/*.mp3', {
      eager: true,
      query: '?url',
      import: 'default',
    });

    const module = audioModules['../assets/voice/fire_alert.mp3'];

    if (!module) return;

    const src = typeof module === 'object' ? module.default : module;
    const fakeAudio = new Audio(src);

    fakeAudio.volume = 0.01; // 几乎无声
    fakeAudio
      .play()
      .then(() => {
        fakeAudio.pause();
        fakeAudio.currentTime = 0;
        console.info('✅ 音频上下文已激活，后续告警声音可正常播放');
      })
      .catch((err) => {
        console.warn('🔇 音频激活失败（可能被阻止）:', err);
      });
  }

  /**
   * 初始化应用核心数据
   */
  const initApp = async () => {
    try {
      // 🎯 关键：只注册一次用户交互监听（用于解锁音频）
      if (!hasRegisteredInteraction) {
        hasRegisteredInteraction = true;
        document.addEventListener('click', unlockAudio, { once: true });
        document.addEventListener('touchstart', unlockAudio, { once: true });
        console.info('👂 已注册音频解锁事件监听（click / touchstart）');
      }

      // 1. 获取当前用户信息
      await systemStore.SELECT_LOGIN_CURRENT();

      // 2. 获取系统菜单 & 权限
      await systemStore.getSystemPermissionAllApi();

      // 3. 获取组织架构
      await systemStore.getSystemDeptAllApi();

      // 4. 获取角色
      await systemStore.getSystemRoleAllApi();

      // 7. 启动 STOMP WebSocket（如果未连接）
      if (!stompJsStore.stompClient) {
        const options = {
          onMessage: (message) => {
            console.info('[STOMP] 收到消息:', message);

            // 忽略系统消息
            if ((Array.isArray(message) && ['ping', '连接成功'].includes(message[0])) || message.type === 'ping') {
              return;
            }

            // 只处理带 type 的对象
            if (typeof message === 'object' && message !== null && message.type) {
              const { type } = message;

              alarmStore.addAlarm(message, type);

              // 语音映射表
              const VOICE_MAP = {
                PERSON: 'fire_alert.mp3',
                UAV: 'fire_alert.mp3',
                FIRE_PTZ: 'fire_alert.mp3',
                VEHICLE_INTRUSION: 'vehicle_intrusion.mp3',
                PERSONNEL_INTRUSION: 'person_intrusion.mp3',
                URGENT_EVENT: '紧急事件.mp3',
              };

              const audioFileName = VOICE_MAP[type];

              if (!audioFileName) return;

              // 动态加载语音文件
              const audioModules = import.meta.glob('../assets/voice/*.mp3', {
                eager: true,
                query: '?url',
                import: 'default',
              });
              const moduleKey = `../assets/voice/${audioFileName}`;
              const audioModule = audioModules[moduleKey];

              if (!audioModule) {
                console.warn(`⚠️ 未找到语音文件: ${moduleKey}`);

                return;
              }

              const src = typeof audioModule === 'object' ? audioModule.default : audioModule;
              const audio = new Audio(src);

              audio.loop = false;

              audio.onended = () => {
                console.info(`🔊 语音播放结束: ${audioFileName}`);
              };

              audio
                .play()
                .then(() => {
                  console.info(`🔊 正在播放: ${audioFileName}`);
                })
                .catch((err) => {
                  // 🔔 播放失败（常见于未解锁音频上下文）
                  console.warn('❌ 语音播放失败（可能被浏览器阻止）:', err);
                  // 可在此添加 fallback 提示：如“点击页面任意位置启用声音”
                });
            }
          },
        };

        stompJsStore.setActivate(options);
      }

      console.info('✅ 应用初始化完成');
    } catch (error) {
      console.error('❌ 应用初始化失败:', error);
      ElMessage.error('应用初始化失败，请重新登录');
      clearToken();
      throw error;
    }
  };

  /**
   * 安全初始化：检查 Token 是否存在
   */
  const safeInit = async () => {
    if (!getToken()) {
      console.warn('⚠️ 未检测到 Token，跳过初始化');

      return false;
    }

    try {
      await initApp();

      return true;
    } catch (error) {
      return false;
    }
  };

  return {
    initApp,
    safeInit,
  };
}
